package Procesador;

import java_cup.runtime.*;

%%

%class Scanner

%unicode
%cup 
%line 
%column

programa = 		"program"
declaraciones =	"vars"
constantes = 	"consts"
tipos = 		"tipos"
tipo = 			"tipo"
subprograms = 	"subprograms"
subprogram = 	"subprogram"
instructions = "instructions"
variable = 		"var"
constante = 	"const"
booleanos = 	"true" | "false"
naturales = 	0 | [1-9][0-9]*
enteros = 		0|-? [1-9][0-9]*
reales = 		{enteros} ( \. ( 0* [1-9]+)* | 0 )? ([E | e] -? [natural])?  
character = 	\'[^\']\'
int = 			"int"
nat = 			"nat"
char = 			"char"
type = 			"boolean" | "character" | "natural" | "integer" | "float"
in = 			"in"
out = 			"out"
not = 			"not"
if = 			"if"
then = 			"then"
else = 			"else"
endif = 		"endif"
while = 		"while"
do = 			"do"
endwhile = 		"endwhile"
call = 			"call"
and = 			"and"
or = 			"or"
suma = 			"+"
multiplica =	"*"
division = 		"/"
resta = 		"-"
modulo = 		"%"
identificador = [a-z][a-zA-Z0-9]*
%%


{programa} 		{return new Symbol(sym.PROGR, new Token(yytext(),yyline,yycolumn) );}
{declaraciones} {return new Symbol(sym.DECS,new Token(yytext(),yyline,yycolumn));}
{constantes} 	{return new Symbol(sym.CONSTS,new Token(yytext(),yyline,yycolumn));}
{then} 			{return new Symbol(sym.THEN,new Token(yytext(),yyline,yycolumn));}
{tipos} 		{return new Symbol(sym.TIPOS,new Token(yytext(),yyline,yycolumn));}
{tipo} 			{return new Symbol(sym.TIPO,new Token(yytext(),yyline,yycolumn));}
{subprograms} 	{return new Symbol(sym.SUBPGMS,new Token(yytext(),yyline,yycolumn));}
{subprogram} 	{return new Symbol(sym.SUBPGM,new Token(yytext(),yyline,yycolumn));}
{instructions} 	{return new Symbol(sym.INSTRUCC,new Token(yytext(),yyline,yycolumn));}
{variable} 		{return new Symbol(sym.VAR,new Token(yytext(),yyline,yycolumn));}
{constante} 	{return new Symbol(sym.CONST,new Token(yytext(),yyline,yycolumn));}
{type} 			{return new Symbol(sym.TYPE,new Token(yytext(),yyline,yycolumn));}
{booleanos} 	{return new Symbol(sym.BOOL,new Token(yytext(),yyline,yycolumn));}
{naturales} 	{return new Symbol( sym.NAT,new Token(yytext(),yyline,yycolumn));}
{enteros} 		{return new Symbol(sym.INT,new Token(yytext(),yyline,yycolumn));}
{reales} 		{return new Symbol(sym.FLOAT,new Token(yytext(),yyline,yycolumn));}
{int} 			{return new Symbol(sym.CINT,new Token(yytext(),yyline,yycolumn));}
{nat} 			{return new Symbol(sym.CNAT,new Token(yytext(),yyline,yycolumn));}
{char} 			{return new Symbol(sym.CCHAR,new Token(yytext(),yyline,yycolumn));}
{in} 			{return new Symbol(sym.IN,new Token(yytext(),yyline,yycolumn));}
{out} 			{return new Symbol(sym.OUT,new Token(yytext(),yyline,yycolumn));}
{not} 			{return new Symbol(sym.NOT,new Token(yytext(),yyline,yycolumn));}
{call} 			{return new Symbol(sym.CALL,new Token(yytext(),yyline,yycolumn));}
{if} 			{return new Symbol(sym.IF,new Token(yytext(),yyline,yycolumn));}
{else} 			{return new Symbol(sym.ELSE,new Token(yytext(),yyline,yycolumn));}
{endif} 		{return new Symbol(sym.ENDIF,new Token(yytext(),yyline,yycolumn));}
{while} 		{return new Symbol(sym.WHILE,new Token(yytext(),yyline,yycolumn));}
{do} 			{return new Symbol(sym.DO,new Token(yytext(),yyline,yycolumn));}
{endwhile} 		{return new Symbol(sym.ENDWHILE,new Token(yytext(),yyline,yycolumn));}
{and} 			{return new Symbol(sym.AND,new Token(yytext(),yyline,yycolumn));}
{or} 			{return new Symbol(sym.OR,new Token(yytext(),yyline,yycolumn));}
\(				{return new Symbol(sym.PAP,new Token(yytext(),yyline,yycolumn));}
\) 				{return new Symbol(sym.PCIERRE,new Token(yytext(),yyline,yycolumn));}
\{ 				{return new Symbol(sym.CORCHETEAP,new Token(yytext(),yyline,yycolumn));}
\} 				{return new Symbol(sym.CORCHETECI,new Token(yytext(),yyline,yycolumn));}
\: 				{return new Symbol(sym.DOSPUN,new Token(yytext(),yyline,yycolumn));}
">" 			{return new Symbol(sym.MAYOR,new Token(yytext(),yyline,yycolumn));}
"<" 			{return new Symbol(sym.MENOR,new Token(yytext(),yyline,yycolumn));}
">=" 			{return new Symbol(sym.MAYOREQ,new Token(yytext(),yyline,yycolumn));}
"<=" 			{return new Symbol(sym.MENOREQ,new Token(yytext(),yyline,yycolumn));}
"==" 			{return new Symbol(sym.EQEQ,new Token(yytext(),yyline,yycolumn));}
"!=" 			{return new Symbol(sym.DIST,new Token(yytext(),yyline,yycolumn));}
":=" 			{return new Symbol(sym.ASIG,new Token(yytext(),yyline,yycolumn));}
"<<" 			{return new Symbol(sym.IZQ,new Token(yytext(),yyline,yycolumn));}
">>" 			{return new Symbol(sym.DER,new Token(yytext(),yyline,yycolumn));}
\= 				{return new Symbol(sym.EQ,new Token(yytext(),yyline,yycolumn));}
\; 				{return new Symbol(sym.PUNTCOM,new Token(yytext(),yyline,yycolumn));}
\] 				{return new Symbol(sym.CUADCI,new Token(yytext(),yyline,yycolumn));}
\[ 				{return new Symbol(sym.CUADAP,new Token(yytext(),yyline,yycolumn));}
\_ 				{return new Symbol(sym.BARRABAJA,new Token(yytext(),yyline,yycolumn));}
\@ .*			{}
{suma}			{return new Symbol(sym.SUM,new Token(yytext(),yyline,yycolumn));}
{resta} 		{return new Symbol(sym.DIFF,new Token(yytext(),yyline,yycolumn));}
{multiplica} 	{return new Symbol(sym.MULT,new Token(yytext(),yyline,yycolumn));}
{division} 		{return new Symbol(sym.DIV,new Token(yytext(),yyline,yycolumn));}
\, 				{return new Symbol(sym.COMA,new Token(yytext(),yyline,yycolumn));}
{modulo} 		{return new Symbol(sym.MOD,new Token(yytext(),yyline,yycolumn));}
{character} 	{return new Symbol(sym.CHAR,new Token(yytext(),yyline,yycolumn));}
{identificador} {return new Symbol(sym.IDENTIFICADOR,new Token(yytext(),yyline,yycolumn));}
[\t\r\n ] 		{}
[^] 			{throw new Error("Caracter no reconocido:"+yytext());}